package com.pap.rabbitmq.receiver;

import java.io.IOException;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import com.pap.rabbitmq.config.RabbitMQConfig;
import com.rabbitmq.client.Channel;

@Service
public class MsgAckReceiver {
	/**
	 * 消息队列，只接收消息内容
	 * 
	 */
	@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME_MSG)
	public void receivMsg(Message message, Channel channel) {
		byte[] body = message.getBody();
		System.out.println("收到消息：" + new String(body));

		// 确认消息已经消费成功
		try {
			// consumer处理成功后，通知broker删除队列中的消息，如果设置multiple=true，表示支持批量确认机制以减少网络流量。
			// 例如：有值为5,6,7,8 deliveryTag的投递
			// 如果此时channel.basicAck(8, true);则表示前面未确认的5,6,7投递也一起确认处理完毕。
			// 如果此时channel.basicAck(8, false);则仅表示deliveryTag=8的消息已经成功处理。
			// channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);//
			// 确认成功

			// consumer处理失败后，例如：有值为5,6,7,8 deliveryTag的投递。
			// 注意第三个参数的设置，是否requeue(重新放回队列)
			// 如果channel.basicNack(8, true, true);表示deliveryTag=8之前未确认的消息都处理失败且将这些消息重新放回队列中。
			// 如果channel.basicNack(8, true, false);表示deliveryTag=8之前未确认的消息都处理失败且将这些消息直接丢弃。
			// 如果channel.basicNack(8, false, true);表示deliveryTag=8的消息处理失败且将该消息重新放回队列。
			// 如果channel.basicNack(8, false, false);表示deliveryTag=8的消息处理失败且将该消息直接丢弃。
			channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);// 确认失败
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}